﻿#include "System.h"
#include "XyNet/Common/Exception.h"
#include "XyNet/Common/StringConverter.h"

#ifdef XYNET_PLATFORM_WINDOWS
#	include <windows.h>
#endif

namespace XyNet
{
	function<void(const string&)> System::_consoleWriteLineHandler;

	FileSystem::Path System::_dataPath
#ifdef XYNET_PLATFORM_WINDOWS
		= "../";
#else
		= "./";
#endif
	FileSystem::Path System::_tempPath
#ifdef XYNET_PLATFORM_WINDOWS
		= "../Temp";
#else
		= "./Temp";
#endif

	const FileSystem::Path& System::getDataPath()
	{
		if (!FileSystem::isExists(_dataPath))
			FileSystem::createDirectories(_dataPath);
		return _dataPath;
	}

	void System::setDataPath(const FileSystem::Path& path)
	{
		_dataPath = path;
	}

	const FileSystem::Path& System::getTempPath()
	{
		if (!FileSystem::isExists(_tempPath))
			FileSystem::createDirectories(_tempPath);
		return _tempPath;
	}

	void System::setTempPath(const FileSystem::Path& path)
	{
		_tempPath = path;
	}

	FileSystem::Path System::getConfigPath()
	{
		FileSystem::Path path = _dataPath / "Configs";
		if (!FileSystem::isExists(path))
			FileSystem::createDirectories(path);
		return path;
	}

	FileSystem::Path System::getLogPath()
	{
		FileSystem::Path path = _tempPath / "Logs";
		if (!FileSystem::isExists(path))
			FileSystem::createDirectories(path);
		return path;
	}

	FileSystem::Path System::getResourcePath()
	{
		FileSystem::Path path = _dataPath / "Resources";
		if (!FileSystem::isExists(path))
			FileSystem::createDirectories(path);
		return path;
	}

	void System::consoleWriteLine(const string& message)
	{
		static mutex _mutex;
		unique_lock<mutex> lock(_mutex);
		if (_consoleWriteLineHandler)
			_consoleWriteLineHandler;
		else
			cout << StringConverter::utf8ToLocal(message) << endl;
	}

	void System::setConsoleWriteLineHandler(const function<void(const string&)>& handler)
	{
		_consoleWriteLineHandler = handler;
	}

	//locale System::getSystemLocale()
	//{
	//	return boost::locale::generator().generate(boost::locale::util::get_system_locale());
	//}

	void System::popupMessageBox(const string& message, const string& caption)
	{
#ifdef XYNET_PLATFORM_WINDOWS
		MessageBoxW(nullptr, StringConverter::utf8ToWideString(message).c_str(),
			StringConverter::utf8ToWideString(caption).c_str(), MB_OK);
#else
		cout << caption << ": " << message << endl;
#endif
	}
}

//////////////////////////////////////////////////////////////////////////

namespace XyNet
{
	XYNET_API void SystemSetDataPath(string* path)
	{
		try
		{
			System::setDataPath(*path);
		}
		catch (const exception& e)
		{
			HandleException(e);
		}
	}

	XYNET_API void SystemSetTempPath(string* path)
	{
		try
		{
			System::setTempPath(*path);
		}
		catch (const exception& e)
		{
			HandleException(e);
		}
	}
}